﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Engine.ScheduleAlgo;
using DataTransferObject;

namespace Engine.TaskPrioritizeAlgo
{
    /*
     * Trách nhiệm cao cả:
     *  Từ 1 danh sách tasklist chưa hoặc có độ ưu tiên sơ xài
     *  Tạo ra 1 danh sách tasklist đã có độ ưu tiên rõ ràng
     * Đây là vấn đề cần phải được thỏa thuận tìm hiểu, nghiên cứu thêm
     * Class này chỉ là gợi ý
     */
    public class PrioritizeTaskList : IPrioritizeAlgorithm
    {
        #region Properties
        private SystemConfiguration systemConfiguration;
        private PriorityCriteria criteria; // thuộc tính tạm thời, sẽ điều chỉnh sau
        private PrioritizeReport prioritizeReport; // thuộc tính tạm thời, sẽ điều chỉnh sau
        #endregion

        #region Essential Methods
        public PrioritizeTaskList() { }

        public PrioritizeTaskList(ref List<TaskForSchedule> t, SystemConfiguration s, PriorityCriteria criteria, PrioritizeReport prioritizeReport)
        {
            //this.taskList = t;
            this.systemConfiguration = s;
            this.criteria = criteria;
            this.prioritizeReport = prioritizeReport;
        }

        public bool setPriorityParameter(ref List<TaskForSchedule> taskList, SystemConfiguration systemConfiguration, PriorityCriteria criteria, ref PrioritizeReport report)
        {
            /*
             * GỌI TIẾP CÁC ALGORITHM Ở TẦNG ALGORITHME (PROJECT SỐ 5 VÀ 6)
             * NHẬN KẾT QUẢ TRẢ VỀ, PRESENTER SẼ NHẬN KẾT QUẢ NÀY
             */ 
            //int number1 = taskList.NumberOfTask;

            //int number2 = priorityPreSortTask(taskList);// Gọi hàm sort tasks theo prorioty

            //return (number1 == number2);
            return false;
        }
        #endregion

        #region bổ sung
        /* @LUÂN
         * CÁC BẠN CÓ THỂ:
         * 1. COMMENT VỀ NHỮNG BỔ SUNG GÓP Ý
         * 2. VIẾT CODE ĐỀ XUẤT TRONG REGION NÀY
         * 
        */

        /*
         * Thêm 1 hàm JSKECalculatePriority. Parameter và kiểu trả về sẽ tính tóan sau
        */
        public void JSKECalculatePriority()
        {
        }

        public void prioritizeTasks(ref TaskList tasks, SystemConfiguration systemConfig)
        {
            double[] weight = new double[10];
            double[] priority = new double[10];
            double sum;
            
            for (int i = 0; i < 10; i++)
            {
                weight[i] = i;
                priority[i] = 0;
            }

            for (int i = 0; i < tasks.NumberOfTask; i++)
            {
                switch (systemConfig.TabTaskData.OrderBy)
                {
                    case 0:
                        priority[0] = tasks.GetTaskList[i].Priority;
                        break;
                    case 1:
                        priority[0] = tasks.GetTaskList[i].ScheduledEndDate.Subtract(DateTime.Now).TotalMinutes / 1000;
                        break;
                    //case 2:
                    //    priority[0] = tasks.GetTaskList[i].projectPriority;
                    //    break;
                    default:
                        break;
                }

                switch (systemConfig.TabTaskData.OrderByType)
                {
                    case 0:
                        priority[1] = tasks.GetTaskList[i].Priority;
                        break;
                    case 1:
                        priority[1] = tasks.GetTaskList[i].ScheduledEndDate.Subtract(DateTime.Now).TotalMinutes / 1000;
                        break;
                    //case 2:
                    //    priority[1] = tasks.GetTaskList[i].projectPriority;
                    //    break;
                    default:
                        break;
                }
                sum = 0;
                for (int j = 0; j < 10; j++)
                {
                    sum += weight[j] * priority[j];
                }

                tasks.GetTaskList[i].Weight = sum;
            }
            
        }

        /// <summary>
        /// Priorities the pre sort task.
        /// </summary>
        /// <param name="taskList">The task list.</param>
        /// <returns></returns>
        private static int priorityPreSortTask(TaskList taskList)
        {

            return taskList.SortPriority();
        }

        /// <summary>
        /// Deadlines the pre sort task.
        /// </summary>
        /// <param name="taskList">The task list.</param>
        private static void deadlinePreSortTask(TaskList taskList)
        {
            int number = 0;
            number = taskList.SortDeadline();
        }


        #endregion
    }
}
